package com.yuexun.dhdoctor.module.meeting.zxing;


import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;


import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.ReaderException;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.Result;
import com.yuexun.dhdoctor.R;
import com.yuexun.dhdoctor.module.meeting.ui.Act_MeetingCheck;
import com.yuexun.dhdoctor.zxing.camera.CameraManager;
import com.yuexun.dhdoctor.zxing.camera.PlanarYUVLuminanceSource;

import java.util.Hashtable;

public class MeetingDecodeHandler extends Handler {
	private static final String TAG = MeetingDecodeHandler.class.getSimpleName();

	  private final Act_MeetingCheck activity;
	  private final MultiFormatReader multiFormatReader;

	  MeetingDecodeHandler(Act_MeetingCheck activity, Hashtable<DecodeHintType, Object> hints) {
	    multiFormatReader = new MultiFormatReader();
	    multiFormatReader.setHints(hints);
	    this.activity = activity;
	  }

	  @Override
	  public void handleMessage(Message message) {
	    switch (message.what) {
	      case R.id.decode:
	        //Log.d(TAG, "Got decode message");
	        decode((byte[]) message.obj, message.arg1, message.arg2);
	        break;
	      case R.id.quit:
	        Looper.myLooper().quit();
	        break;
	    }
	  }

	  /**
	   * Decode the data within the viewfinder rectangle, and time how long it took. For efficiency,
	   * reuse the same reader objects from one decode to the next.
	   *
	   * @param data   The YUV preview frame.
	   * @param width  The width of the preview frame.
	   * @param height The height of the preview frame.
	   */
	  private void decode(byte[] data, int width, int height) {
	    long start = System.currentTimeMillis();
	    Result rawResult = null;
	    
	    //modify here
	    byte[] rotatedData = new byte[data.length];
	    for (int y = 0; y < height; y++) {
	        for (int x = 0; x < width; x++)
	            rotatedData[x * height + height - y - 1] = data[x + y * width];
	    }
	    int tmp = width; // Here we are swapping, that's the difference to #11
	    width = height;
	    height = tmp;
	    
	    PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);
	    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
	    try {
	      rawResult = multiFormatReader.decodeWithState(bitmap);
	    } catch (ReaderException re) {
	      // continue
	    } finally {
	      multiFormatReader.reset();
	    }

	    if (rawResult != null) {
	      long end = System.currentTimeMillis();
	      Log.d(TAG, "Found barcode (" + (end - start) + " ms):\n" + rawResult.toString());
	      Message message = Message.obtain(activity.getHandler(), R.id.decode_succeeded, rawResult);
	      Bundle bundle = new Bundle();
	      bundle.putParcelable(MeetingDecodeThread.BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap());
	      message.setData(bundle);
	      //Log.d(TAG, "Sending decode succeeded message...");
	      message.sendToTarget();
	    } else {
	      Message message = Message.obtain(activity.getHandler(), R.id.decode_failed);
	      message.sendToTarget();
	    }
	  }
}
